package dao

import (
	"encoding/json"
	"gin/TEST01/entity"
	"gin/common"
	"gin/common/db/config"
	sysEntity "gin/system/entity"
	"github.com/gin-gonic/gin"
	"log"
)

type User struct {
	//主键
	//ID int32
	//通过在字段后面的标签来定义golang字段和表字段的关系
	//例如：`gorm:"column:username"` 标签说明含义是：Mysql表的列名（字段名）为 username
	UserId   int    `gorm:"column:user_id"`
	UserName string `gorm:"column:user_name"`
	NickName string `gorm:"column:nick_name"`
	//CreateTime int64  `gorm:"column:create_time"` //创建时间，时间戳
}

type PageHelper struct {
	pageNum  int
	pageSize int
}

// 映射表名
func (user User) TableName() string {
	return "sys_user"
}

func SaveUser(user *User) (num int) {
	//新增
	err := config.DB.Create(user).Error
	if err != nil {
		log.Println("新增用户失败，原因：", err)
		num = 0
		return 0
	} else {
		log.Print("新增用户成功")
		return 1
	}
}

func GetUserById(id int) User {
	var user User
	err := config.DB.Where("user_id = ?", id).First(&user).Error
	if err != nil {
		log.Println("查询用户失败，原因：", err)
	}
	return user
}

func GetUserByList(user *User) []*User {
	//查收过滤条件拼装
	// var userName = user.UserName

	//申明一个数组
	var userList []*User
	//查询多条记录，Find函数返回的是一个数组
	//单表
	err := config.DB.Where("1=?", "1").Find(&userList).Error

	if err != nil {
		log.Println("查询用户失败，原因：", err)
	}
	return userList
}

//TODO 弃用 根据用户名称查询用户信息
func GetUserFindByUserNameList(loginBody *sysEntity.LoginBody) []map[string]interface{} {
	//查收过滤条件拼装
	userName := loginBody.UserName
	password := loginBody.Password
	log.Println("=============取值数据库查询："+userName)
	log.Println("=============取值数据库查询："+password)
	//申明一个数组
	var resultList []map[string]interface{}
	//查询多条记录，Find函数返回的是一个数组
	err := config.GormDb.Model(&sysEntity.LoginBody{}).Table("sys_user ").Select("user_id", "user_name").Where("LOWER(user_name) = LOWER(?)", userName).Scan(&resultList).Error
	if err != nil {
		log.Println("查询用户失败，原因：", err)
		//panic("用户查询失败")
	}
	log.Println("查询用户成功，并返回======================")
	return resultList
}

//多表联合orm
func GetByUserJoinList(c *gin.Context, user *entity.SysUserEntity) []map[string]interface{} {
	//查收过滤条件拼装
	// var userName = user.UserName

	//申明一个数组
	//var userList []*User

	var resultList []map[string]interface{}

	err := config.GormDb.Model(&entity.SysUserEntity{}).Table("sys_user as user").Select("user.user_id as deptId", "user.user_name as userName", "user.nick_name nickName", "dept.dept_name as deptName").
		Joins("LEFT JOIN sys_dept as dept on user.dept_id = dept.dept_id").Where("1 = 1").Scan(&resultList).Error

	if err != nil {
		log.Println("查询用户失败，原因：", err)
		// 根据具体错误情况进行处理，比如记录日志、返回错误信息给调用者等
		errToJson := MapToJson(err)
		//主要错误信息提取
		common.ReturnError(c, 500, /*err*/ errToJson, resultList, int64(len(resultList)))
		panic("代码执行异常，不会进行下一步代码逻辑的调用，以及返回")
	}
	return resultList
}

//MAP 集合 转字符串
func MapToJson(data interface{}) string {
	byteStr, _ := json.Marshal(data)
	return string(byteStr)
}
